package core;

/*
 * Desenvolvido para a disciplina Desenvolvimento de Aplicações Web.
 * Curso Tecnologia em Telematica.
 * Instituto Federal de Educação, Ciência e Tecnologia.
 */

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sql.AlunoBD;
import sql.AlunoException;
import sql.ConexaoException;
import sql.CursoBD;

/**
 * SAW - Sistema Academica Web.
 * Servlet de tratamento das prioridades do Aluno.
 *
 * @author Antonio Carlos Trajano de Oliveira, antonio.c.trajano@gmail.com
 * @author Icaro Vasconcelos Souza, icaroswim@gmail.com
 * @version 1.0
 */
public class AlunoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AlunoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		determinaAcoes( request, response );
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
	private void determinaAcoes( HttpServletRequest req, HttpServletResponse res ) {
		Enumeration nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "cadastrar") ) {
			cadastrarAluno( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "pesquisar") ) {
			pesquisarAluno( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "remover") ) {
			removerAluno( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "editar") ) {
			editarAluno( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "atualizar") ) {
			atualizarAluno( req, res );
		}
	}

	private boolean temParametro( Enumeration lstNomes, String nome ) {
		while( lstNomes.hasMoreElements() ) {
			String nomeDaLista = (String) lstNomes.nextElement();
			if( nomeDaLista.compareTo(nome) == 0 ) {
				return true;
			}
		}
		return false;
	}
	
	private boolean cadastrarAluno( HttpServletRequest req, HttpServletResponse res ) {
		AlunoBD bd = new AlunoBD();
		
		String nome = req.getParameter( "nome" );
		String matricula = req.getParameter( "matricula" );
		try {
			bd.addAluno( nome, matricula );
			bd.close();
		} catch (AlunoException e) {
			mensagemErro(req, res, "Erro Cadastro", e.getMessage() );
			return false;
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		mensagemSucesso( req, res, "Sucesso Cadastro.", "Aluno <b>" + nome + "</b> cadastrado com sucesso.");
		
		return true;
	}
	
	private boolean pesquisarAluno(HttpServletRequest req, HttpServletResponse res) {
		AlunoBD bd = new AlunoBD();
		
		String nome = req.getParameter( "pesquisar" );
		try {
			
			ArrayList<Aluno> lstAlunos = bd.getAlunos(nome);
			RequestDispatcher rd = req.getRequestDispatcher("pesquisa_aluno.jsp");
			req.setAttribute("lista_resposta", lstAlunos );
			rd.forward(req, res);
			bd.close();
			
		} catch (ConexaoException e) {
			mensagemErro(req, res, "Erro Pesquisa", e.getMessage() );
			return false;
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean removerAluno(HttpServletRequest req, HttpServletResponse res) {
		AlunoBD bd = new AlunoBD();
		
		String matricula = req.getParameter( "remover" );
		
		try {
			bd.delAluno( matricula );
			bd.close();
		} catch (AlunoException e) {
			mensagemErro(req, res, "Erro Remover", e.getMessage() );
			return false;
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		
		mensagemSucesso(req, res, "Sucesso Remover", "Aluno removido com sucesso.");
		return true;
	}
	
	private boolean editarAluno(HttpServletRequest req, HttpServletResponse res) {
		AlunoBD bd = new AlunoBD();
		
		String matricula = req.getParameter( "editar" );
		
		try {
			
			Aluno tempAluno = bd.getAluno( matricula );
			RequestDispatcher rd = req.getRequestDispatcher( "editar_aluno.jsp" );
			req.setAttribute( "aluno", tempAluno );
			rd.forward( req, res );
			bd.close();
			
		} catch (AlunoException e) {
			mensagemErro(req, res, "Erro Editar", e.getMessage());
			return false;
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean atualizarAluno( HttpServletRequest req, HttpServletResponse res ) {
		AlunoBD bd = new AlunoBD();
		
		String nome = req.getParameter( "nome" );
		String matricula = req.getParameter( "matricula" );
		String matriculaAntiga = req.getParameter( "old" );
		try {
			Aluno tempAluno = new Aluno( nome, matricula );
			for( int i = 0; i < 3; i++ ) {
				CursoBD bdCurso = new CursoBD();
				
				if( req.getParameter("curso" + (i + 1) ).compareTo("null") == 0 ) {
					tempAluno.setCurso(i, null);
				} else {
					tempAluno.setCurso(i, bdCurso.getCursoPorCodigo( req.getParameter("curso" + (i + 1) ) ) );
				}
			}
			
			bd.updateAluno( tempAluno, matriculaAntiga );
			bd.close();
		} catch (ConexaoException e) {
			e.printStackTrace();
		} catch (AlunoException e) {
			mensagemErro(req, res, "Erro Atualização", e.getMessage() );
			return false;
		}
		mensagemSucesso( req, res, "Sucesso Atualização.", "Aluno <b>" + nome + "</b> editado com sucesso.");
		
		return true;
	}
	
	private void mensagemErro( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("erro.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void mensagemSucesso( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("sucesso.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}